/** Ecouteur du bouton Valider de la fenetre d'acquisition Plan */

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;

import javax.swing.*;

import java.io.*;

public class EcouteurValiderPlan implements ActionListener{
	private PagePrincipale pageP;
	private FenetreAcquisition fenetreA;
	
	/** creation de l'ecouteur sur les TextField
	 * 
	 * @param pageP page d'accueil
	 */
	public EcouteurValiderPlan(PagePrincipale pageP, FenetreAcquisition fenetreA){
		this.pageP = pageP;
		this.fenetreA = fenetreA;
	}

	/** actions a realiser à chaque clic sur Valider de la fenetre CreationPlan */
	public void actionPerformed(ActionEvent e){
		JTextField tf;
		double valeur;
		JLabel lab;
		
		try{
			// recuperer la valeur de latitude
			tf = fenetreA.getLat();
			valeur = Double.parseDouble(tf.getText());
			pageP.setLatitude(valeur);
			lab = pageP.getLat();
			lab.setText(tf.getText());
			
			// si besoin, recuperer le fuseau
			if ( !pageP.isHeureSolaire() ) {
				tf = fenetreA.getF();
				valeur = Double.parseDouble(tf.getText());
				pageP.setFuseau(valeur);
				lab = pageP.getFus();
				lab.setText(tf.getText());
			}
			
			// recuperer la longueur du plan
			tf = fenetreA.getLongu();
			valeur = Double.parseDouble(tf.getText());
			pageP.setLongueur(valeur);
			
			// recuperer la largeur du plan
			tf = fenetreA.getLarg();
			valeur = Double.parseDouble(tf.getText());
			pageP.setLargeur(valeur);
			
			// recuperer l'inclinaison verticale
			tf = fenetreA.getAngVert();
			valeur = Double.parseDouble(tf.getText());
			pageP.setAngleVert(valeur);
			
			// recuperer l'inclinaison horizontale
			tf = fenetreA.getAngHor();
			valeur = Double.parseDouble(tf.getText());
			pageP.setAngleHori(valeur);
			
			// recuperer la coordonnee Ouest
			tf = fenetreA.getxVal();
			valeur = Double.parseDouble(tf.getText());
			pageP.setX(valeur);
			lab = pageP.getxVal();
			lab.setText(tf.getText());
			
			// recuperer la coordonnee Sud
			tf = fenetreA.getyVal();
			valeur = Double.parseDouble(tf.getText());
			pageP.setY(valeur);
			lab = pageP.getyVal();
			lab.setText(tf.getText());
			
			// recuperer la coordonnee Normale
			tf = fenetreA.getzVal();
			valeur = Double.parseDouble(tf.getText());
			pageP.setZ(valeur);
			lab = pageP.getzVal();
			lab.setText(tf.getText());
			
			// creer le fichier facettes
			creerFichierFacettes();
			
			// redonner la main sur la fenetre principal
			pageP.getFenetrePrincipale().setEnabled(true);
			
			// fermer la fenetre
			fenetreA.getFenetreAcquisition().dispose();
		}
		// afficher message d'erreur si toutes les entrees n'ont pas ete mentionnees ou si elles ne sont pas toutes des nombres.
		catch(NumberFormatException err){
			System.out.println("Entrees invalides ou incompletes");
			JDialog erreur = new JDialog(fenetreA.getFenetreAcquisition(),"Erreur");
			erreur.setVisible(true);
			erreur.setBounds(500, 400, 300, 80);
			JLabel message = new JLabel("Entrees invalides ou incompletes",JLabel.CENTER);
			erreur.add(message);
		}
	}
	
	/** cr�ation du fichier des facettes */
	private void creerFichierFacettes() {
		try {
			PrintWriter f = new PrintWriter(new FileWriter("facettes.txt"));
			
			Facette[] lesFacettes = calculerFacettes(pageP.getLargeur(), pageP.getLongueur(), pageP.getAngleVert(), pageP.getAngleHori());
			
			f.println(2);
			
			Point3D style = new Point3D(pageP.getX(),pageP.getY(),pageP.getZ());
			pageP.setSysteme(new RotationTerre(pageP.getLatitude(),style));
			
			for(int i = 0; i<=1; i++) {
				Point3D sommet1 = lesFacettes[i].getOrigine();
				sommet1.ecrire(f);
				
				double x2 = lesFacettes[i].getU().get(1) + sommet1.x;
				double y2 = lesFacettes[i].getU().get(2) + sommet1.y;
				double z2 = lesFacettes[i].getU().get(3) + sommet1.z;	
				
				Point3D sommet2 = new Point3D(x2,y2,z2);
				sommet2.ecrire(f);
				
				double x3 = lesFacettes[i].getV().get(1) + sommet1.x;
				double y3 = lesFacettes[i].getV().get(2) + sommet1.y;
				double z3 = lesFacettes[i].getV().get(3) + sommet1.z;
				
				Point3D sommet3 = new Point3D(x3,y3,z3);
				sommet3.ecrire(f);
				
				sommet1.affiche();
				sommet2.affiche();
				sommet3.affiche();
				/*lesFacettes[i].getOrigine().affiche();
				lesFacettes[i].getU().affiche();
				lesFacettes[i].getV().affiche();*/
				System.out.println("facette OK");
				pageP.getSysteme().ajouterFacette(new Facette(sommet1,sommet2,sommet3));
				//pageP.systeme.ajouterFacette(lesFacettes[i]);
			}
			f.close();
			
			
			//////////////////////
			// CALCUL DES COURBES
			//////////////////////
			/*
			
			pageP.setCourbes(new Affichage(pageP.getSysteme()));
			pageP.getCourbes().setPreferredSize(new Dimension(1000,1000));
			//pageP.getCourbes().setBounds(0, 0, 1400, 1000);
			
			
			Container c = pageP.getFenetrePrincipale().getContentPane();
			c.setLayout(new BorderLayout());
			JPanel pane = new JPanel();
			c.add(pane, BorderLayout.LINE_START);
			pane.add(pageP.getCourbes());
			
			
			pageP.getzA().add(pageP.getCourbes());
			
			*/
		}
		catch(IOException e) {
			System.out.println("Erreur Creation Fichier");
		} 
	}
	
	/** decoupage du plan et deux facettes triangulaires */
	private static Facette[] calculerFacettes(double largeur, double longueur, double angleV, double angleH){
		Facette[] lesFacettes = new Facette[2];
		
		Point3D origine = new Point3D(0,0,0);
		
		// application des rotation pour calculer les coordonnees des sommets des facettes
		Vecteur u1 = new Vecteur(largeur,0,0);
		Vecteur u2 = new Vecteur(largeur,longueur,0);
		Vecteur u3 = new Vecteur(0,longueur,0);
		
		Matrice rotationH = Matrice.rotationM(new Vecteur(0,0,1),angleH);
		Matrice rotationV = Matrice.rotationM(u1,angleV);
		
		u1 = u1.applique(rotationH);
		u2 = u2.applique(rotationH).applique(rotationV);
		u3 = u3.applique(rotationH).applique(rotationV);
		
		lesFacettes[0] = new Facette(origine,u1,u2);
		lesFacettes[1] = new Facette(origine,u2,u3);
		
		return lesFacettes;
	}
}
